#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include "lv_drivers/display/fbdev.h"
#include  "lvgl/examples/lv_examples.h"
#include "lv_drivers/indev/evdev.h"
#include "UI/ui.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>
#include "./obj/head.h"
#include "ft2build.h"
// #include <stdio.h>
#define DISP_BUF_SIZE (128 * 1024)      // 定义显示缓冲区大小为128KB

int main(void)
{
    /*LittlevGL初始化*/
    lv_init();

    
    /*Linux帧缓冲设备初始化
     * 用于初始化显示屏硬件接口，准备好显示输出通道
     */
    fbdev_init();


    /*为LittlevGL创建一个小型缓冲区，用于绘制屏幕内容*/
    static lv_color_t buf[DISP_BUF_SIZE];

    /*初始化缓冲区描述符
     * 用于管理显示缓冲区，告知LVGL缓冲区的地址和大小
     */
    static lv_disp_draw_buf_t disp_buf;
    lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);

    /*初始化并注册显示驱动
     * 配置显示参数并注册到LVGL，建立图形库与硬件显示的连接
     */
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);       // 初始化显示驱动结构体
    disp_drv.draw_buf   = &disp_buf;   // 绑定显示缓冲区
    disp_drv.flush_cb   = fbdev_flush; // 设置缓冲区刷新回调函数(将缓冲区内容输出到屏幕)
    disp_drv.hor_res    = 800;         // 设置显示屏水平分辨率
    disp_drv.ver_res    = 480;         // 设置显示屏垂直分辨率
    lv_disp_drv_register(&disp_drv);   // 注册显示驱动

    /*初始化输入设备驱动(如触摸屏/鼠标)*/
    evdev_init();
    static lv_indev_drv_t indev_drv_1;
    lv_indev_drv_init(&indev_drv_1);   // 初始化输入设备驱动结构体
    indev_drv_1.type = LV_INDEV_TYPE_POINTER; // 设置输入设备类型为指针设备(如鼠标/触摸屏)

    /*设置输入设备读取回调函数
     * 该函数会被LVGL定期调用，用于获取鼠标位置和状态
     */
    indev_drv_1.read_cb = evdev_read;
    lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); // 注册输入设备驱动


    // /*为鼠标设置光标
    //  * 加载光标图标并关联到输入设备，实现鼠标指针显示
    //  */
    // LV_IMG_DECLARE(mouse_cursor_icon)          // 声明鼠标光标图标资源
    // lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); // 在当前屏幕创建图像对象作为光标
    // lv_img_set_src(cursor_obj, &mouse_cursor_icon);       // 设置光标图像资源
    // lv_indev_set_cursor(mouse_indev, cursor_obj);         // 将光标对象与输入设备关联


    /*创建演示界面
     * 加载LVGL内置的控件演示程序，展示各种UI组件
     */
    // lv_demo_widgets();
    // lv_example_freetype_1();
    // fonts();
    my_ui_init();
    ui_init();


    /*处理LittlevGL任务(无tick模式)
     * 主循环中定期处理LVGL的事件和渲染任务，维持UI运行
     */
    while(1) {
        lv_timer_handler();  // 处理LVGL的定时器和任务队列
        usleep(5000);        // 休眠5毫秒，控制循环频率
    }

    return 0;
}

/*自定义系统时间获取函数
 * 在lv_conf.h中被配置为`LV_TICK_CUSTOM_SYS_TIME_EXPR`，提供LVGL所需的系统时间基准
 */
uint32_t custom_tick_get(void)
{
    static uint64_t start_ms = 0;
    if(start_ms == 0) {  // 首次调用时初始化起始时间
        struct timeval tv_start;
        gettimeofday(&tv_start, NULL);  // 获取当前时间(微秒级)
        // 转换为毫秒级时间戳
        start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
    }

    // 获取当前时间并转换为毫秒级时间戳
    struct timeval tv_now;
    gettimeofday(&tv_now, NULL);
    uint64_t now_ms;
    now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;

    // 计算相对于起始时间的毫秒数，作为LVGL的时间基准
    uint32_t time_ms = now_ms - start_ms;
    return time_ms;
}